# 交叉编译器配置（RISC-V 64位）
CC = riscv64-unknown-elf-gcc
LD = riscv64-unknown-elf-ld
OBJCOPY = riscv64-unknown-elf-objcopy
QEMU = qemu-system-riscv64
GDB = riscv64-unknown-elf-gdb  # 调试器

# 编译选项（核心优化）
CFLAGS = -nostdlib -ffreestanding  # 不依赖标准库，作为独立程序运行
CFLAGS += -march=rv64g -mabi=lp64  # 目标架构：RV64G（支持整数、浮点），64位ABI
CFLAGS += -mcmodel=medany          # 关键：启用中等地址模型，解决R_RISCV_HI20重定位错误
CFLAGS += -g -O2 -Wall -Wextra     # 调试信息、优化级别、严格警告（发现潜在问题）
CFLAGS += -ffunction-sections -fdata-sections  # 每个函数/数据放在独立段，便于链接时裁剪

# 链接选项
LDFLAGS = -T linker.ld  # 使用自定义链接脚本
LDFLAGS += --gc-sections  # 移除未使用的段，减小内核体积

# 目标文件（新增中断相关目标文件）
OBJS = boot.o main.o printf.o pmm.o vmm.o panic.o interrupt.o clint.o plic.o trap_entry.o sbi.o scheduler.o

# 默认目标：构建内核
all: kernel.elf

# 链接生成ELF文件
kernel.elf: $(OBJS)
	$(LD) $(LDFLAGS) -o $@ $(OBJS)
	@echo "链接完成：$@"

# 编译C源文件
%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<
	@echo "编译C文件：$< -> $@"

# 编译汇编源文件（与C编译选项保持一致，确保架构和模型匹配）
%.o: %.s
	$(CC) $(CFLAGS) -c -o $@ $<
	@echo "编译汇编文件：$< -> $@"

# 运行QEMU模拟器（显式指定内存大小，避免默认内存不足）
run: kernel.elf
	$(QEMU) -machine virt -nographic -bios none -kernel kernel.elf -m 128M
	@echo "QEMU运行结束"

# 调试模式（配合GDB使用）
debug: kernel.elf
	@echo "启动QEMU调试模式（等待GDB连接...）"
	$(QEMU) -machine virt -nographic -bios none -kernel kernel.elf -m 128M -s -S &
	$(GDB) kernel.elf -ex "target remote localhost:1234"  # 连接QEMU调试端口

# 清理生成文件
clean:
	rm -f *.o kernel.elf
	@echo "清理完成"

# 伪目标（避免与同名文件冲突）
.PHONY: all run debug clean
